package com.im.service.impl;

import com.alibaba.fastjson2.JSON;
import com.im.constant.RedisConstant;
import com.im.entity.ImSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class RedisSessionService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 构造单个用户会话列表的 Redis key
     * 格式：im:session:user:{userId}
     *
     * @param userId 用户ID
     * @return Redis Key
     */
    private String buildSessionKey(Integer userId) {
        return RedisConstant.SESSION_USER_PREFIX + userId;
    }

    /**
     * 单聊会话创建时，将会话ID存储到双方的会话列表中（使用管道批量操作）。
     *
     * @param userId    发起会话的用户ID
     * @param targetId  目标用户ID
     * @param sessionId 会话ID
     */
    public void addPrivateSession(Integer userId, Integer targetId, Long sessionId) {
        final String sessionIdStr = sessionId.toString();
        List<Object> results = redisTemplate.executePipelined(new SessionCallback<Object>() {
            @Override
            public Object execute(org.springframework.data.redis.core.RedisOperations operations) {
                // 将 sessionId 添加到发起者的会话列表中
                operations.opsForSet().add(buildSessionKey(userId), sessionIdStr);
                // 将 sessionId 添加到目标用户的会话列表中
                operations.opsForSet().add(buildSessionKey(targetId), sessionIdStr);
                return null;
            }
        });
        // 确认批量操作结果
        System.out.println("Batch addPrivateSession completed: " + results);
    }

    /**
     * 群聊创建时，将会话ID存储到所有群成员的会话列表中（使用管道批量操作）。
     *
     * @param memberIds 群成员的用户ID列表
     * @param sessionId 会话ID（群聊的 sessionID）
     */
    public void addGroupSession(List<Integer> memberIds, Long sessionId) {
        final String sessionIdStr = sessionId.toString();
        List<Object> results = redisTemplate.executePipelined(new SessionCallback<Object>() {
            @Override
            public Object execute(org.springframework.data.redis.core.RedisOperations operations) {
                for (Integer userId : memberIds) {
                    operations.opsForSet().add(buildSessionKey(userId), sessionIdStr);
                }
                return null;
            }
        });
        System.out.println("Batch addGroupSession completed: " + results);
    }

    /**
     * 群聊解散时，从所有群成员的会话列表中移除该会话ID（使用管道批量操作）。
     *
     * @param memberIds 群成员的用户ID列表
     * @param sessionId 会话ID（群聊的 sessionID）
     */
    public void removeGroupSessionForMembers(List<Integer> memberIds, Long sessionId) {
        final String sessionIdStr = sessionId.toString();
        List<Object> results = redisTemplate.executePipelined(new SessionCallback<Object>() {
            @Override
            public Object execute(org.springframework.data.redis.core.RedisOperations operations) {
                for (Integer userId : memberIds) {
                    operations.opsForSet().remove(buildSessionKey(userId), sessionIdStr);
                }
                return null;
            }
        });
        System.out.println("Batch removeGroupSessionForMembers completed: " + results);
    }

    /**
     * 群聊成员单个加入时，将会话ID添加到该成员的会话列表中。
     *
     * @param userId    加入群聊的用户ID
     * @param sessionId 会话ID（群聊的 sessionID）
     */
    public void addGroupSessionForMember(Integer userId, Long sessionId) {
        redisTemplate.opsForSet().add(buildSessionKey(userId), sessionId.toString());
        System.out.println("addGroupSessionForMember completed for userId: " + userId);
    }

    /**
     * 群聊成员退出时，从该成员的会话列表中移除该会话ID。
     *
     * @param userId    退出群聊的用户ID
     * @param sessionId 会话ID（群聊的 sessionID）
     */
    public void removeGroupSessionForMember(Integer userId, Long sessionId) {
        redisTemplate.opsForSet().remove(buildSessionKey(userId), sessionId.toString());
        System.out.println("removeGroupSessionForMember completed for userId: " + userId);
    }

    /**
     * 从 Redis 中获取指定用户的所有会话ID列表。
     *
     * @param userId 当前用户ID
     * @return 会话ID的集合（String形式，可转换为 Long）
     */
    public List<Integer> getSessionListForUser(Integer userId) {
        return new ArrayList<>(redisTemplate.opsForSet().members(buildSessionKey(userId)));
    }
}
